package cn.tedu.oop2;
/*本类用于多态的入门案例*/
public class TestDeno {
    public static void main(String[] args) {
        Animal a= new Animal();
        Cat c = new Cat();
        Dog d = new Dog();
        a.eat();//调用的是父类自己的功能
        c.eat();
        d.eat();
        /*2、父类对象不可以使用子类的特有功能*/
//        a.jump();
        c.jump();
        d.run();
        /*3、口诀1：父类引用指向子类对象
        * 解释：创建出来的子类对象的地址值，交给父类类型的引用类型变量来保存*/
        Animal a1 = new Cat();//Cat类对象的地址值交给父类型变量a1来保存
        Animal a2 = new Dog();//Dog类对象的地址值交给父类型变量a2来保存
        /*口诀2：编译看左边，运行看右边
        * 解释：必须要在父类定义这个方法，才能通过编译，把多态对象看作是父类类型
        * 必须要在子类重写这个方法，才能满足多态，实际干活的是子类*/
        a2.eat();
    }
}
/*多态的前提：继承加重写*/
//创建父类
class Animal{
    public void eat(){
        System.out.println("小动物Animal吃啥都行");
    }
}
//创建子类
class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println("小猫爱吃小鱼干");
    }
    public void jump(){
        System.out.println("小猫Cat跳的老高啦");
    }
}
//创建子类
class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println("小狗爱吃肉骨头");
    }
//    添加子类的特有功能
    public void run(){
        System.out.println("小狗Dog跑的老快了");
    }
}